package cn.edu.njtc.controller;

import cn.edu.njtc.common.R;
import cn.edu.njtc.entity.dto.PatientMapStatsDto;
import cn.edu.njtc.entity.dto.ProvinceDetailDto;
import cn.edu.njtc.entity.dto.ProvinceStatsDto;
import cn.edu.njtc.service.PatientMapService;
import cn.edu.njtc.util.ChinaRegionUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@Tag(name = "用户信息管理",description = "患者地图管理接口")
@RequestMapping("/patient-map")
@RequiredArgsConstructor
public class PatientMapController {
    private final PatientMapService patientMapService;

    /**
     * 获取全国患者分布数据
     * @return 包含全国患者统计和各省份分布数据
     */
    @GetMapping("/national")
    @Operation(summary = "获取全国患者分布数据")
    public R<PatientMapStatsDto> getNationalData() {
        return R.ok(patientMapService.getNationalMapData());
    }

    /**
     * 获取指定省份患者详情
     * @param provinceName 省份名称
     * @return 该省份患者详情数据
     */
    @GetMapping("/provinces/{provinceName}")
    @Operation(summary = "获取指定省份患者详情")
    public ResponseEntity<ProvinceDetailDto> getProvinceData(
            @PathVariable String provinceName,
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "10") int size) {

        // Spring Boot 推荐校验方式
        if (!StringUtils.hasText(provinceName)) {
            throw new ResponseStatusException(
                    HttpStatus.BAD_REQUEST,
                    "省份名称不能为空"
            );
        }

        return ResponseEntity.ok(patientMapService.getProvinceData(provinceName));
    }

    /**
     * 获取所有有患者的省份列表
     * @return 省份名称列表
     */
    @GetMapping("/provinces")
    @Operation(summary = "获取所有有患者的省份列表")
    public R<List<String>> getProvinceList() {
        List<ProvinceStatsDto> stats = patientMapService.getNationalMapData().getProvinceStats();
        List<String> provinces = stats.stream()
                .map(ProvinceStatsDto::getProvinceName)
                .collect(Collectors.toList());
        return R.ok(provinces);
    }

    /**
     * 获取系统支持的所有省份列表（包括没有患者的省份）
     * @return 全部省份列表
     */
    @GetMapping("/all-provinces")
    @Operation(summary = "获取系统支持的所有省份列表")
    public R<List<String>> getAllProvinces() {
        // 可以从常量或配置文件中获取完整的省份列表
        return R.ok(ChinaRegionUtils.getAllProvinces());
    }
}
